package cn.buk.api.eotms.service;

import cn.buk.api.eotms.dto.*;
import cn.buk.common.dto.CommonDto;
import cn.buk.tms.common.dto.base.BaseDto;
import cn.buk.tms.common.dto.flight.BaseChangeOrderDto;
import cn.buk.tms.common.dto.flight.BaseRefundOrderDto;
import com.fasterxml.jackson.core.JsonProcessingException;

/**
 * @author yfdai
 */
public interface FlightApiService {

  /**
   * 获取访问令牌
   * @return tokenResponse
   */
  TokenResponse getToken();

  /**
   * 登录
   * @param rq 登录请求
   * @return 登录结果
   */
  cn.buk.api.eotms.dto.LoginResponse login(LoginRequest rq);

  LoginResponse login();

  /**
   * 查看登录状态
   * @param token 登录令牌
   * @return 登录结果
   */
  LoginResponse checkLoginStatus(String  token);

  /**
   * 获取用户拥有的角色
   * @param token 登录令牌
   * @return 用户角色的数组
   */
  String[] getUserRoles(String token);

  /**
   * 获取用户信息
   * @param token 登录令牌
   * @return 用户信息
   */
  UserProfile getUserProfile(String token);

  /**
   * 查询乘机人信息
   * @param token 登录令牌
   * @param name 乘机人姓名，可空
   * @param pageNo 页码
   * @param pageSize 页记录数
   * @return 乘机人信息返回
   */
  PassengersResponse searchPassengers(String token, String name, int pageNo, int pageSize);

  /**
   * 查询保险产品
   * @param token 登录令牌
   * @param pageNo 页码
   * @param pageSize 页记录数
   * @return 保险产品返回
   */
  InsuranceResponse searchInsurances(String token, int pageNo, int pageSize);

  /**
   * 创建机票订单
   * @param token 登录令牌
   * @param rq 订单内容对象
   * @return 订单创建结果
   */
  FlightOrderCreateResponse createFlightOrder(String token, FlightOrderCreateRequest rq);

  /**
   * 查找机票订单
   * @param token 登录令牌
   * @param name  乘机人姓名
   * @param pageNo 页码
   * @param pageSize 页记录数
   */
  CommonDto<FlightOrderResponse> searchFlightOrders(String token, String name, int pageNo, int pageSize) throws JsonProcessingException;
  /**
   * 获取订单详情
   * @param token 登录令牌
   * @param orderId 订单id
   * @return 订单结果
   */
  FlightOrderResponse getFlightOrder(String token, int orderId);
  FlightOrderResponse getFlightOrder(String token, String orderNo);

  /**
   * 提交订单开票
   * @param token 登录令牌
   * @param orderId 订单id
   * @return 操作结果
   */
  BaseDto submitFlightOrder(String token, int orderId);

  /**
   * 查找退票单
   * @param token 登录令牌
   * @param psgName 查找条件：乘机人姓名
   * @param pageNo 页码
   * @param pageSize 页记录数
   * @return 退票
   * @throws JsonProcessingException
   */
  CommonDto<BaseRefundOrderDto> searchFlightRefundOrders(String token, String psgName, int pageNo, int pageSize) throws JsonProcessingException;

  /**
   * 获取退票单详情
   * @param token 登录令牌
   * @param orderId 订单id
   * @return 退票单详情
   */
  BaseRefundOrderDto getFlightRefundOrder(String token, int orderId);

  /**
   * 创建退票单
   * @param token 登录令牌
   * @param rq 创建退票单请求
   * @return 创建结果
   */
  BaseDto createFlightRefundOrder(String token, RefundOrderCreateRequest rq);

  /**
   * 查找改签单
   * @param token 登录令牌
   * @param psgName 查找条件(乘机人姓名）
   * @param pageNo 页码
   * @param pageSize 页记录数
   * @return 查询结果
   * @throws JsonProcessingException
   */
  CommonDto<BaseChangeOrderDto> searchFlightChangeOrders(String token, String psgName, int pageNo, int pageSize) throws JsonProcessingException;

  /**
   * 获取改签单详情
   * @param token 登录令牌
   * @param orderId 订单id
   * @return 改签单详情
   */
  BaseChangeOrderDto getFlightChangeOrder(String token, int orderId);

  /**
   * 创建改签单
   * @param token 登录令牌
   * @param rq 创建改签单请求
   * @return 操作结果
   */
  BaseDto createFlightChangeOrder(String token, ChangeOrderCreateRequest rq);
}
